package edu.upc.dao.consulta.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import edu.upc.dao.consulta.ConsultaAvisoOfertanteDao;
import edu.upc.model.Aviso;
import edu.upc.model.DetalleAvisoPostulante;
import edu.upc.model.Especialidad;
import edu.upc.model.Ofertante;
import edu.upc.model.PerfilProfesional;
import edu.upc.model.Solicitante;

@Component
public class ConsultaAvisoOfertanteDaoImpl implements ConsultaAvisoOfertanteDao {

	@Autowired
	DataSource dataSource;
	
	public List<Aviso> obtenerAvisoPorOfertante(Ofertante ofertante) {

		String sql = "SELECT a.id_avi, a.cargo_avi, a.cargo_avi, a.inicio_avi, a.fin_avi, a.descripcion_avi, a.jornadaLaboral_avi, a.disponibilidad_avi, a.requerimientos_avi, a.beneficios_avi, a.sueldo_avi, a.conteoLectura_avi, a.id_Especialidad,(SELECT e.nombre_espe FROM tb_especialidad e WHERE e.id_Especialidad = a.id_Especialidad ) AS DSCRP FROM tb_aviso a WHERE a.id_per = ? and a.estado_avi = 'P';";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Aviso> lst = new ArrayList<Aviso>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, ofertante.getId());
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding avisos by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
		
	}
	
	private List<Aviso> mapResult(ResultSet rs) throws SQLException {
		List<Aviso> lstAviso=new ArrayList<Aviso>();
		while(rs.next()){
			Aviso aviso = new Aviso();
			aviso.setId(Integer.parseInt(rs.getString("id_avi")));
			aviso.setCargo(rs.getString("cargo_avi"));
			aviso.setFechaInicio(rs.getDate("inicio_avi"));
			aviso.setFechaFin(rs.getDate("fin_avi"));
			aviso.setDescripcion(rs.getString("descripcion_avi"));
			aviso.setJornadaLaboral(rs.getString("jornadaLaboral_avi"));
			aviso.setDisponibilidad(rs.getString("disponibilidad_avi"));
			aviso.setRequerimiento(rs.getString("requerimientos_avi"));
			aviso.setBeneficios(rs.getString("beneficios_avi"));
			aviso.setSueldo(new BigDecimal(rs.getString("sueldo_avi")));
			//aviso.setEstado(rs.getString("estado_avi"));
			aviso.setContadorVisitas(rs.getInt("conteoLectura_avi"));
			
			Especialidad especialidad = new Especialidad();
			especialidad.setIdEspecialidad(rs.getInt("id_Especialidad"));
			especialidad.setNombreEspecialidad(rs.getString("DSCRP"));
			aviso.setEspecialidad(especialidad);
			aviso.setListDetalleAvisoPostulante(obtenerDetalleAvisoPostulante(aviso));
			lstAviso.add(aviso);
		}

		return lstAviso;
	}

	public int conteoPostulantesPorAviso(Aviso aviso) {
		String sql = "SELECT count(1) as Conteo FROM tb_detalle_aviso_postulante WHERE id_avi = ?;";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		int count = 0;
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, aviso.getId());
			rs = ps.executeQuery();
			if (rs.next()) {
				count = rs.getInt("Conteo");
			}
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding avisos by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return count;
	}

	public Solicitante obtenerDetalleSolicitante(Solicitante solicitante) {
		String sql = "SELECT id_per,email_per,titulo_per,resumen_per,disponibilidad_per,salario_per,nombreRazonSocial_per,apellidoPaterno_per,apellidoMaterno_per,direccion_per,numeroDocumento_per,sexo_per,fechaNacimiento_per,telefono_per,celular_per,id_tipper,id_tipusu,id_dis,id_tipdoc FROM tb_persona WHERE id_per = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, solicitante.getId());
			rs = ps.executeQuery();
			solicitante = mapResultSolicitante(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding avisos by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return solicitante;
	}
	
	private Solicitante mapResultSolicitante(ResultSet rs) throws SQLException {
		Solicitante solicitante = new Solicitante();
		while(rs.next()){
			solicitante.setId(Integer.parseInt(rs.getString("id_per")));
			solicitante.setCorreo(rs.getString("email_per"));
			solicitante.setNombre(rs.getString("nombreRazonSocial_per"));
			solicitante.setApellidoPaterno(rs.getString("apellidoPaterno_per"));
			solicitante.setApellidoMaterno(rs.getString("apellidoMaterno_per"));
			
			PerfilProfesional perfil =new PerfilProfesional();
			perfil.setTituloProfesional(rs.getString("titulo_per"));
			perfil.setResumenProfesional(rs.getString("resumen_per"));
			perfil.setDisponibilidadHoraria(rs.getString("disponibilidad_per"));
			perfil.setPretencionEconomica(new BigDecimal(rs.getString("salario_per")));
			solicitante.setPerfilProfesional(perfil);
			solicitante.setDireccion(rs.getString("direccion_per"));
			solicitante.setNumeroDocumento(rs.getString("numeroDocumento_per"));
			solicitante.setTipoDocumento(rs.getString("id_tipdoc"));
			solicitante.setSexo(rs.getString("sexo_per"));
			solicitante.setFechaNacimiento(rs.getDate("fechaNacimiento_per"));
			solicitante.setTelefono(rs.getString("telefono_per"));
			solicitante.setCelular(rs.getString("celular_per"));
		}

		return solicitante;
	}

	public List<DetalleAvisoPostulante> obtenerDetalleAvisoPostulante(Aviso aviso) {
		String sql = "SELECT id_per, estado_avi FROM tb_detalle_aviso_postulante WHERE id_avi = ?;";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<DetalleAvisoPostulante> lst = new ArrayList<DetalleAvisoPostulante>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, aviso.getId());
			rs = ps.executeQuery();
			while(rs.next()){
				DetalleAvisoPostulante d = new DetalleAvisoPostulante();
				
				Solicitante solicitante = new Solicitante();
				solicitante.setId(rs.getInt("id_per"));
				d.setSolicitante(solicitante);
				d.setEstado(rs.getString("estado_avi"));
				lst.add(d);
			}
			
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding avisos by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}

}
